package taladro.proyecto;

import java.io.*;

import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;

import controles.interfaz.Consola;
import taladro.instrucciones.*;
import taladro.maquina.Herramienta;

// Referenced classes of package taladro.proyecto:
//            TraductorArchivo, Proyecto

public class TraductorArchivoGerber extends TraductorArchivo
{

    boolean absoluteCoordinate;
    boolean unitsMM;
    int intX;
    int decX;
    int intY;
    int decY;

    public TraductorArchivoGerber()
    {
        absoluteCoordinate = true;
        intX = intY = 4;
        decX = decY = 2;
        unitsMM = true;
    }

    public void traduceProyecto(Proyecto proyecto)
    {
        this.proyecto = proyecto;
        try
        {
            BufferedReader in = new BufferedReader(new FileReader(proyecto.getNombArchivo()));
            Instruccion inst = null;
            String str;
            do
            {
                str = in.readLine();
                if(str != null)
                {
                	IConsole consolas[]=ConsolePlugin.getDefault().getConsoleManager().getConsoles();
                    ((Consola)consolas[0]).imprime(str);  
                    System.out.println(str);
                    inst = traduceLinea(str);
                    if(inst != null)
                    {
                    	((Herramienta)(proyecto.getHerramientas().lastElement())).getInstrucciones().add(inst);
                        proyecto.getAdminInstrucciones().addInstruccion(inst);                        
                    }
                }
            } while(str != null);
            in.close();
        }
        catch(FileNotFoundException fnf)
        {
        	IConsole consolas[]=ConsolePlugin.getDefault().getConsoleManager().getConsoles();
            ((Consola)consolas[0]).imprime("File not found");  
            System.out.println("File not found");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        //System.out.println((new StringBuilder()).append("Dimensiones ").append(maxX).append(" ").append(maxY).toString());
    }

    public Instruccion traduceLinea(String str)
    {
        String linea = str.toUpperCase().trim();
        Instruccion inst = null;
        if(linea.startsWith("%"))
        {
            inst = traducirLineaParametro(linea);
        } else
        {
            inst = traducirLineaFuncion(linea);
        }
        return inst;
    }

    protected Instruccion traducirLineaParametro(String lineaInst)
    {
        String linea = lineaInst.substring(1);
        Instruccion instruccion = null;
        if(linea.startsWith("FS"))
        {
            instruccion = new InstPuntoCero();
            if(linea.indexOf("A", 2) > 0)
            {
                absoluteCoordinate = true;
            }
            if(linea.indexOf("I", 2) > 0)
            {
                absoluteCoordinate = false;
            }
            int posX = linea.indexOf("X", 2);
            int posY = linea.indexOf("Y", 2);
            if(posX > 0)
            {
                try
                {
                    String aux = linea.substring(posX + 1, posX + 2);
                    intX = Integer.parseInt(aux);
                    aux = linea.substring(posX + 2, posX + 3);
                    decX = Integer.parseInt(aux);
                }
                catch(NumberFormatException e)
                {
                	IConsole consolas[]=ConsolePlugin.getDefault().getConsoleManager().getConsoles();
                    ((Consola)consolas[0]).imprime("Error en formato especificaci\363n X de archivo");
                    System.out.println("Error en formato especificaci\363n X de archivo");
                    e.printStackTrace();
                }
            }
            if(posY > 0)
            {
                try
                {
                    String aux = linea.substring(posY + 1, posY + 2);
                    intY = Integer.parseInt(aux);
                    aux = linea.substring(posY + 2, posY + 3);
                    decY = Integer.parseInt(aux);
                }
                catch(NumberFormatException e)
                {
                	IConsole consolas[]=ConsolePlugin.getDefault().getConsoleManager().getConsoles();
                    ((Consola)consolas[0]).imprime("Error en formato especificaci\363n Y de archivo");
                    System.out.println("Error en formato especificaci\363n Y de archivo");
                    e.printStackTrace();
                }
            }
        }
        if( linea.startsWith("AD")){
            //instruccion = new InstCambiaHerr(new Herramienta(linea));
        	Herramienta h=new Herramienta(linea);
        	this.proyecto.getHerramientas().add(h);
        	instruccion = new InstCambiaHerr(h);
        }
        if(linea.startsWith("MO"))
        {
            if(linea.indexOf("MM", 2) > 0)
            {
                unitsMM = true;
            }
            if(linea.indexOf("IN", 2) > 0)
            {
                unitsMM = false;
            }
        }
        return instruccion;
    }

    protected Instruccion traducirLineaFuncion(String linea)
    {
        Instruccion instruccion = null;
        if(linea.startsWith("G"))
        {
            instruccion = traducirInstGs(linea);
        }
        if(linea.startsWith("X") || linea.startsWith("Y"))
        {
            instruccion = traducirInstMovimiento(linea);
        }
        if(linea.startsWith("D"))
        {
            instruccion = traducirInstDs(linea);
        }
        if(linea.startsWith("M"))
        {
            instruccion = traducirInstMs(linea);
        }
        return instruccion;
    }

    protected Instruccion traducirInstGs(String linea)
    {
        if(!linea.startsWith("G04"));
        return null;
    }

    protected Instruccion traducirInstMs(String linea)
    {
        Instruccion instruccion = null;
        if(linea.equalsIgnoreCase("M02*"))
        {
            instruccion = new InstPuntoCero();
        }
        return instruccion;
    }

    protected Instruccion traducirInstMovimiento(String linea)
    {
        int posX = 0;
        int posY = 0;
        int posD = 0;
        double x = 0.0D;
        double y = 0.0D;
        int down = 0;
        posX = linea.indexOf("X");
        posY = linea.indexOf("Y");
        posD = linea.indexOf("D");
        try
        {
            if(posX >= 0)
            {
                posX++;
                String aux = linea.substring(posX, posY);
                x = Double.parseDouble(aux);
                if(decX > 0)
                {
                    x /= Math.pow(10D, decX);
                }
            }
            if(posY >= 0)
            {
                posY++;
                String aux = linea.substring(posY, posD);
                y = Double.parseDouble(aux);
                if(decY > 0)
                {
                    y /= Math.pow(10D, decY);
                }
            }
            if(posD > 0)
            {
                posD++;
                String aux = linea.substring(posD, posD + 2);
                if(aux.equalsIgnoreCase("01"))
                {
                    down = 1;
                } else
                {
                    down = 0;
                }
            }
        }
        catch(NumberFormatException e)
        {
            e.printStackTrace();
            //System.out.println((new StringBuilder()).append("Error al formatear inst movimiento ").append(linea).toString());
        }
        if(x > maxX)
        {
            maxX = x;
        }
        if(y > maxY)
        {
            maxY = y;
        }
        Instruccion instruccion = new InstMover(x, y, down);
        return instruccion;
    }

    protected Instruccion traducirInstDs(String linea)
    {
        Instruccion instruccion = null;
        return instruccion;
    }
}
